#ifndef __KEY_H__
#define __KEY_H__

#include "ti_msp_dl_config.h"
#include <stdbool.h>
#include <stdint.h>

// 按键状态枚举
typedef enum {
    KEY_STATE_RELEASED = 0,    // 按键释放状态
    KEY_STATE_PRESSED = 1,     // 按键按下状态
    KEY_STATE_DEBOUNCING = 2   // 按键防抖状态
} KEY_State_t;

// 按键事件枚举
typedef enum {
    KEY_EVENT_NONE = 0,        // 无事件
    KEY_EVENT_PRESS = 1,       // 按键按下事件
    KEY_EVENT_RELEASE = 2,     // 按键释放事件
    KEY_EVENT_LONG_PRESS = 3   // 长按事件
} KEY_Event_t;

// 按键配置参数
#define KEY_DEBOUNCE_TIME_MS        20      // 防抖时间 (毫秒)
#define KEY_LONG_PRESS_TIME_MS      1000    // 长按时间 (毫秒)
#define KEY_SCAN_INTERVAL_MS        10      // 按键扫描间隔 (毫秒)

// 按键GPIO定义 (从ti_msp_dl_config.h获取)
#define KEY_S3_PORT                 GPIO_KEY_PORT
#define KEY_S3_PIN                  GPIO_KEY_KEY_S3_PIN

// 按键结构体
typedef struct {
    KEY_State_t current_state;      // 当前状态
    KEY_State_t last_state;         // 上一次状态
    uint32_t debounce_counter;      // 防抖计数器
    uint32_t press_counter;         // 按下持续时间计数器
    bool long_press_triggered;     // 长按事件是否已触发
    KEY_Event_t event;              // 按键事件
} KEY_Handle_t;

// 全局按键句柄
extern KEY_Handle_t g_key_s3;

// 函数声明
void KEY_Init(void);
void KEY_Scan(void);
KEY_Event_t KEY_GetEvent(void);
bool KEY_IsPressed(void);
void KEY_ClearEvent(void);
void KEY_IRQHandler(void);

#endif /* __KEY_H__ */
